class MassageChairProtocol {
  constructor() {
    // 协议常量
    this.HEADER_1 = 0x59;
    this.HEADER_2 = 0x57;
    this.HEART_RATE_HEADER_1 = 0x99;
    this.HEART_RATE_HEADER_2 = 0xAA;
    
    // 指令类型映射（基于协议文档）
    this.COMMAND_MAP = {
      // 界面切换 (1~17)
      INTERFACE_SWITCH: 2,
      // 开关机
      POWER: 3,
      // 工作模式 (1~22)
      WORK_MODE: 4,
      // 按摩球上下 上半：01上 02下 下半：03上 04下
      MASSAGE_BALL: 5,
      // 加热身体
      HEAT_BODY: 6,
      // 加热腿部
      HEAT_LEG: 7,
      // 滚轮力度 (1~3)
      ROLLER_INTENSITY: 8,
      // 机芯速度 上机芯：01+ 02- 下机芯：03+ 04-
      MOTOR_SPEED: 9,
      // 气压力度 加1+ 减2- (档位：11~15)
      AIR_PRESSURE: 10,
      // 4D高度 (1~6)
      HEIGHT_4D: 11,
      // 按摩手法 (1~10 11~20)
      MASSAGE_TECHNIQUE: 12,
      // 靠背上下 01上 02下
      BACKREST: 13,
      // 小腿伸缩 01伸 02缩
      CALF_STRETCH: 14,
      // 细腿上下 01上 02下
      LEG_ADJUST: 15,
      // 零重力 (1~3)
      ZERO_GRAVITY: 16,
      // 屏幕亮度 (1~5)
      SCREEN_BRIGHTNESS: 17,
      // 按键音/媒体音
      SOUND_VOLUME: 18,
      // 息屏时间
      SCREEN_TIMEOUT: 19,
      // 语言设置 (1~4)
      LANGUAGE: 20,
      // 蓝牙状态
      BLUETOOTH_STATUS: 21,
      // 氛围灯
      AMBIENT_LIGHT: 22,
      // 语音AI
      VOICE_AI: 23,
      // 暂停
      PAUSE: 24,
      // 气囊位置 01腿部 02腰部 03手部 04肩部
      AIRBAG_POSITION: 25,
      // 机芯位置
      MOTOR_POSITION: 26,
      // OK确认
      OK: 27,
      // 用户1~5
      USER_PROFILE: 28,
      // 小腿揉搓/负离子
      CALF_MASSAGE: 29,
      // 心率 01检测 02保存 03心率清空 04血氧清空 05微循环清空
      HEART_RATE: 30,
      // 宽中窄
      WIDTH_ADJUST: 31,
      // 按摩时间
      MASSAGE_TIME: 32,
      // 体型检测
      BODY_DETECTION: 33
    };

    // 工作模式定义
    this.WORK_MODES = {
      RELAX: 1,           // 舒缓
      DEEP: 2,            // 深层
      STRETCH: 3,         // 伸展
      SPORTS: 4,          // 运动
      SLEEP: 5,           // 睡眠
      CUSTOM: 6,          // 自定义
      // ... 可根据实际需求添加更多模式
    };

    // 按摩手法定义
    this.MASSAGE_TECHNIQUES = {
      KNEADING: 1,        // 揉捏
      TAPPING: 2,         // 敲打
      SHIATSU: 3,         // 指压
      ROLLING: 4,         // 滚动
      VIBRATION: 5,       // 震动
      // ... 可根据实际需求添加更多手法
    };
  }

  /**
   * 创建通用指令
   * @param {string} commandType 指令类型
   * @param {number|object} value 指令值
   * @returns {Buffer} 指令缓冲区
   */
  createCommand(commandType, value) {
    const commandByte = this.COMMAND_MAP[commandType];
    if (commandByte === undefined) {
      throw new Error(`未知的指令类型: ${commandType}`);
    }

    // 创建基础指令结构：头部(2字节) + 指令位置 + 指令值 + 校验位
    const commandData = [this.HEADER_1, this.HEADER_2];
    
    // 填充指令数据（总共34字节，从位置2开始）
    const fullCommand = new Array(35).fill(0); // 包含校验位共35字节
    fullCommand[0] = this.HEADER_1;
    fullCommand[1] = this.HEADER_2;
    
    // 设置具体指令值
    if (typeof value === 'object') {
      this.setComplexCommand(fullCommand, commandByte, value);
    } else {
      fullCommand[commandByte] = value || 1;
    }

    // 计算校验位（XOR）
    let checksum = 0;
    for (let i = 0; i < 34; i++) {
      checksum ^= fullCommand[i];
    }
    fullCommand[34] = checksum;

    return Buffer.from(fullCommand);
  }

  /**
   * 设置复杂指令（如机芯速度、气囊位置等）
   */
  setComplexCommand(commandArray, commandByte, value) {
    switch (commandByte) {
      case this.COMMAND_MAP.MOTOR_SPEED:
        // 机芯速度：上机芯01+ 02- 下机芯03+ 04-
        if (value.upper !== undefined) {
          commandArray[commandByte] = value.upper > 0 ? 0x01 : 0x02;
        }
        if (value.lower !== undefined) {
          commandArray[commandByte] = value.lower > 0 ? 0x03 : 0x04;
        }
        break;
        
      case this.COMMAND_MAP.MASSAGE_BALL:
        // 按摩球：上半01上 02下 下半03上 04下
        if (value.upper !== undefined) {
          commandArray[commandByte] = value.upper ? 0x01 : 0x02;
        }
        if (value.lower !== undefined) {
          commandArray[commandByte] = value.lower ? 0x03 : 0x04;
        }
        break;
        
      case this.COMMAND_MAP.AIRBAG_POSITION:
        // 气囊位置：01腿部 02腰部 03手部 04肩部
        const positions = { leg: 0x01, waist: 0x02, hand: 0x03, shoulder: 0x04 };
        commandArray[commandByte] = positions[value.position] || 0x01;
        break;
        
      case this.COMMAND_MAP.MOTOR_POSITION:
        // 机芯位置：上半身01定点 02局部 03上半身 下半身04定点 05局部 06下半身
        const motorPositions = {
          upperPoint: 0x01, upperLocal: 0x02, upperFull: 0x03,
          lowerPoint: 0x04, lowerLocal: 0x05, lowerFull: 0x06
        };
        commandArray[commandByte] = motorPositions[value.position] || 0x01;
        break;
        
      case this.COMMAND_MAP.WIDTH_ADJUST:
        // 宽中窄：上半0x01 0x02 0x04 下半0x10 0x20 0x40
        let widthValue = 0;
        if (value.upper) {
          widthValue |= (value.upper === 'wide' ? 0x01 : value.upper === 'medium' ? 0x02 : 0x04);
        }
        if (value.lower) {
          widthValue |= (value.lower === 'wide' ? 0x10 : value.lower === 'medium' ? 0x20 : 0x40);
        }
        commandArray[commandByte] = widthValue;
        break;
        
      case this.COMMAND_MAP.SOUND_VOLUME:
        // 按键音量1~5，媒体音量11~15
        if (value.key !== undefined) {
          commandArray[commandByte] = Math.max(1, Math.min(5, value.key));
        }
        if (value.media !== undefined) {
          commandArray[commandByte] = Math.max(11, Math.min(15, value.media + 10));
        }
        break;
        
      default:
        commandArray[commandByte] = typeof value === 'number' ? value : 1;
    }
  }

  /**
   * 创建心率相关指令
   * @param {string} action 操作类型：detect, save, clearHeart, clearOxygen, clearCirculation
   * @returns {Buffer} 心率指令缓冲区
   */
  createHeartRateCommand(action) {
    const actions = {
      detect: 0x01,           // 检测
      save: 0x02,             // 保存
      clearHeart: 0x03,       // 心率清空
      clearOxygen: 0x04,      // 血氧清空
      clearCirculation: 0x05   // 微循环清空
    };

    const actionByte = actions[action];
    if (actionByte === undefined) {
      throw new Error(`未知的心率操作: ${action}`);
    }

    // 心率指令结构：99 AA + 用户 + 心率数据(8字节) + 血氧数据(8字节) + 循环数据(8字节) + 校验位
    const heartRateCommand = new Array(28).fill(0);
    heartRateCommand[0] = this.HEART_RATE_HEADER_1;
    heartRateCommand[1] = this.HEART_RATE_HEADER_2;
    heartRateCommand[2] = 0x01; // 用户ID，默认用户1
    
    // 根据不同操作设置数据
    if (action === 'detect') {
      // 检测操作，其他字节保持0
    }

    // 计算校验位
    let checksum = 0;
    for (let i = 0; i < 27; i++) {
      checksum ^= heartRateCommand[i];
    }
    heartRateCommand[27] = checksum;

    return Buffer.from(heartRateCommand);
  }

  /**
   * 解析接收到的状态数据
   * @param {Buffer} data 接收到的数据
   * @returns {object} 解析后的状态对象
   */
  parseStatus(data) {
    if (!data || data.length < 5) {
      throw new Error('数据长度不足');
    }

    // 验证头部
    if (data[0] !== this.HEADER_1 || data[1] !== this.HEADER_2) {
      throw new Error('数据头部错误');
    }

    // 验证校验位
    let checksum = 0;
    for (let i = 0; i < data.length - 1; i++) {
      checksum ^= data[i];
    }
    
    if (checksum !== data[data.length - 1]) {
      console.warn('校验位不匹配，数据可能有误');
    }

    // 根据协议文档解析状态数据
    const status = {
      interfaceSwitch: data[2],      // 界面切换
      power: data[3],                // 开关机
      workMode: data[4],             // 工作模式
      timeMinute: data[5],           // 分
      timeSecond: data[6],           // 秒
      walkingPoint: {                // 行走点
        upper: (data[7] >> 4) & 0x0F,
        lower: data[7] & 0x0F
      },
      heating: {                     // 加热状态
        body: (data[8] & 0x01) !== 0,
        leg: (data[8] & 0x02) !== 0,
        negativeIon: (data[8] & 0x10) !== 0,
        heartRateDetecting: (data[8] & 0x20) !== 0
      },
      massageMode: data[9],          // 揉搓模式
      rollerIntensity: data[10],     // 滚轮力度
      motorSpeed: {                  // 机芯速度
        upper: (data[11] >> 4) & 0x0F,
        lower: data[11] & 0x0F
      },
      airPressure: data[12],         // 气压力度
      force4D: data[13],             // 4D力度
      massageTechnique: {            // 按摩手法
        upper: (data[14] >> 4) & 0x0F,
        lower: data[14] & 0x0F
      },
      calfMassage: data[15],         // 小腿揉搓显示
      heartRate: data[16],           // 心率
      bloodOxygen: data[17],         // 血氧
      zeroGravity: data[18],         // 零重力
      screenBrightness: data[19],    // 屏幕亮度
      keyVolume: data[20],           // 按键音
      screenTimeout: data[21],       // 息屏时间
      language: data[22],            // 语言设置
      bluetoothStatus: data[23],     // 蓝牙状态
      ambientLight: data[24],        // 氛围灯
      voiceAI: data[25],             // 语音AI
      pauseStatus: data[26],         // 启动暂停
      widthAdjust: {                 // 宽中窄
        upper: data[27] & 0x07,
        lower: (data[27] >> 4) & 0x07
      },
      motorPosition: {               // 机芯位置
        upper: data[28] & 0x07,
        lower: (data[28] >> 4) & 0x07
      },
      airbag: {                      // 气囊
        leg: (data[29] & 0x01) !== 0,
        hand: (data[29] & 0x02) !== 0,
        waist: (data[29] & 0x04) !== 0,
        shoulder: (data[29] & 0x08) !== 0
      },
      bloodCirculation: data[30],    // 血循环
      buzzer: data[31],              // 蜂鸣器
      mediaVolume: data[32],         // 媒体音量
      detectionStatus: data[33],     // 检测状态值
      timestamp: new Date()          // 添加时间戳
    };

    return status;
  }

  /**
   * 解析心率数据
   * @param {Buffer} data 心率数据
   * @returns {object} 解析后的心率对象
   */
  parseHeartRateData(data) {
    if (!data || data.length < 28) {
      throw new Error('心率数据长度不足');
    }

    // 验证心率数据头部
    if (data[0] !== this.HEART_RATE_HEADER_1 || data[1] !== this.HEART_RATE_HEADER_2) {
      throw new Error('心率数据头部错误');
    }

    return {
      user: data[2],
      heartRates: Array.from(data.slice(3, 11)),     // 心率1-8
      bloodOxygens: Array.from(data.slice(11, 19)),  // 血氧1-8
      circulations: Array.from(data.slice(19, 27)),  // 循环1-8
      timestamp: new Date()
    };
  }

  /**
   * 解析接收到的数据
   * @param {Buffer} data 接收到的原始数据
   * @returns {object} 解析结果
   */
  parseReceivedData(data) {
    try {
      // 判断数据类型
      if (data.length >= 2) {
        if (data[0] === this.HEADER_1 && data[1] === this.HEADER_2) {
          // 状态数据
          return {
            type: 'status',
            data: this.parseStatus(data)
          };
        } else if (data[0] === this.HEART_RATE_HEADER_1 && data[1] === this.HEART_RATE_HEADER_2) {
          // 心率数据
          return {
            type: 'heartRate',
            data: this.parseHeartRateData(data)
          };
        }
      }

      // 未知数据格式
      return {
        type: 'unknown',
        rawData: data.toString('hex'),
        length: data.length
      };

    } catch (error) {
      return {
        type: 'error',
        error: error.message,
        rawData: data.toString('hex')
      };
    }
  }

  /**
   * 验证数据校验位
   * @param {Buffer} data 数据缓冲区
   * @returns {boolean} 校验是否通过
   */
  validateChecksum(data) {
    if (data.length < 2) return false;
    
    let checksum = 0;
    for (let i = 0; i < data.length - 1; i++) {
      checksum ^= data[i];
    }
    
    return checksum === data[data.length - 1];
  }
}

module.exports = MassageChairProtocol;